14. 引用

引用

你是否知道,每次调用函数时,输入变量都会复制到内存中?要证明这一点,可以使用以下代码:

#include <iostream>
#include <vector>

using namespace std;

//函数声明,打印出矩阵在内存中的地址
void matrix_address(vector< vector<int> > my_matrix);

int main() {

    //初始化矩阵
    vector< vector<int> > matrix(5, vector<int>(6,2));

    //打印出矩阵地址
    cout << "original variable address: " << &matrix << "\n";

    //运行一个函数,打印出矩阵地址
    matrix_address(matrix);


    return 0;
}

//打印出矩阵地址的函数
void matrix_address(vector< vector<int> > my_matrix) {

    cout << "function variable address: " << &my_matrix << "\n";

}

运行这段代码时,你会得到以下这种输出:

original variable address:0x7fff5fbff650

function variable address:0x7fff5fbff608

那么,这段代码的功能是什么?它在一个名为 matrix 的变量中,初始化了一个 5 乘以 6 的二维向量。然后,代码在内存中二维向量开始的地方打印出这个地址。

接下来,代码会调用一个函数,在函数的输入变量的内存中打印出地址。注意,尽管两个变量的值相同,地址并不一样。

这是因为,当你调用 matrix_address() 时,C++ 再次把二维向量复制到了内存中。

& 符号

在上面的代码中,你可能注意到了这个字符:&。

它给出了变量地址,而不是变量值。你还记得前一课中,我们简单学了点指针的内容吗?& 可以轻松地访问变量地址,不会不小心导致内存错误。

你也可以使用 & 提升代码速度!

& 如何提升代码速度

C++ 有几种基本的数据类型,如整数、字符和单精度浮点数,它们速度相对较快。对这些基本的数据类型,我们将要学习的编程策略可能没什么区别。但是,对于占用大量内存的变量,如阵列和向量,& 就会非常有用。

如果上面的 matrix_address 函数是这么定义的呢?

void matrix_address(vector< vector<int> >&my_matrix);

& 符号告诉编译器,根据引用传递输入变量。这表示,在函数内部,你使用的是原始变量,而不是其复制品。对于二维向量,你就可以省略很多读写。

此外,在某些情况下,你还可以直接修改输入向量,无需在函数内部创建一个新向量。例如,如果你准备在某个向量上进行标量乘法编程,而且又不需要保留原始向量,你就可以直接修改原始向量。在练习中,你会深入了解这一点是什么意思。

练习

在本练习中,你需要回顾前面学过的矩阵加法函数。你要重写一个代码版本,通过引用传递函数。我们看一下,这样能否让代码运行更快!